package jdk.thread.atomic;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * Atomic(CAS)
 *
 * ABA问题，由A改成B又改成A，从而导致后续本来不应该成功的操作，最后成功执行了
 */
public class AtomicIntegerTest {

    public static void main(String[] args) {
        AtomicInteger a  = new AtomicInteger();
        //值自增一并返回旧值
        a.getAndIncrement();
        //在旧值上加上传入值，并返回新值
        a.addAndGet(11);
        //值自减一并返回旧值
        a.getAndDecrement();
        //获取旧值并设置新值
        a.getAndSet(1);
        //直接设置新值
        a.set(100);
        //
        a.compareAndSet(1, 22);
        /**
         * 就传入一个变量值和函数方法， 然后函数方法使用前值和变量值计算出终值，最后CAS设值。
         */
        a.accumulateAndGet(1, null);


        /**
         * 和accumulateAndGet不同，终值的计算只需要使用函数方法，
         * 所以一个叫积累，一个叫修改。
         */
        a.getAndUpdate(null);


        //轻量级的set?  https://blog.csdn.net/szhlcy/article/details/102561224
        a.lazySet(1);

        //不知何物！！！ https://oomake.com/question/50411
        a.weakCompareAndSet(1, 1);

        System.out.println(a.get());
    }
}
